package class33_与哈希函数有关的节点;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Security;

/**
 * 一、HASH函数
 * （1）为什么O(1)推演
 *
 * 二、布隆过滤器
 * (1)原理？  ip地址禁用
 * 布隆过滤器重要的三个公式
 * 1,假设数据量为n.预期的失误率为p(布隆过滤器大小和每个本的大小无关)
 * 2,根据n和p,算出 Bloom Filter一共需要多少个bit位，向上取整，记为m
 * 3,根据m和n,算出 Bloom Filter需要多少个哈希函数，向上取整，记为K
 * 4,根据修正公式,算出真实的失误率 p_true
 *   m=-(n*ln p/(ln2)^2)    k=ln2*m/n = 0.7 * m / n  真实失误率 = （1 - e^-(nk/m)）^k
 *
 * 三、一致性哈希
 * 分布式存储结构最常见的结构
 * 1）哈希域变成环的设计
 *  问题：
 *  1：如何将机器均匀的打在环上
 *  2：增加减少机器怎么保证均匀
 *  答案：虚拟节点技术
 * 2）虚拟节点技术（负载均衡和负载管理）
 *
 */

public class Hash {

	private MessageDigest hash;

	public Hash(String algorithm) {
		try {
			hash = MessageDigest.getInstance(algorithm);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}

	public String hashCode(String input) {
		return "";
//		return DatatypeConverter.printHexBinary(hash.digest(input.getBytes())).toUpperCase();
	}

	public static void main(String[] args) {
		System.out.println("支持的算法 : ");
		for (String str : Security.getAlgorithms("MessageDigest")) {
			System.out.println(str);
		}
		System.out.println("=======");

		String algorithm = "MD5";
		Hash hash = new Hash(algorithm);

		String input1 = "zuochengyunzuochengyun1";
		String input2 = "zuochengyunzuochengyun2";
		String input3 = "zuochengyunzuochengyun3";
		String input4 = "zuochengyunzuochengyun4";
		String input5 = "zuochengyunzuochengyun5";
		System.out.println(hash.hashCode(input1));
		System.out.println(hash.hashCode(input2));
		System.out.println(hash.hashCode(input3));
		System.out.println(hash.hashCode(input4));
		System.out.println(hash.hashCode(input5));

	}

}
